package config

import (
	"encoding/json"
	"fmt"
	"math/rand"
	"os"
	"path/filepath"
	"strconv"
	"strings"
)

// 错误定义
var (
	ErrInvalidData = fmt.Errorf("invalid data")
)

// GenerateRandomFilename 生成随机数字文件名
func GenerateRandomFilename() string {
	return strconv.Itoa(rand.Intn(1000000)) + ConfigFileExt
}

// SaveUserConfig 保存用户配置到加密文件
func SaveUserConfig(userConfig *UserConfig, key []byte) error {
	// 创建配置目录
	if err := os.MkdirAll(ConfigDir, 0755); err != nil {
		return fmt.Errorf("创建配置目录失败: %v", err)
	}

	// 序列化用户配置
	data, err := json.Marshal(userConfig)
	if err != nil {
		return fmt.Errorf("序列化配置失败: %v", err)
	}

	// 加密配置
	encrypted, err := Encrypt(data, key)
	if err != nil {
		return fmt.Errorf("加密配置失败: %v", err)
	}

	// 生成随机文件名
	filename := GenerateRandomFilename()
	filepath := filepath.Join(ConfigDir, filename)

	// 保存加密文件
	return os.WriteFile(filepath, []byte(encrypted), 0644)
}

// LoadAllUserConfigs 从目录加载所有用户配置
func LoadAllUserConfigs(key []byte) ([]*UserConfig, error) {
	// 检查目录是否存在，不存在则创建
	if _, err := os.Stat(ConfigDir); os.IsNotExist(err) {
		if err := os.MkdirAll(ConfigDir, 0700); err != nil {
			return nil, fmt.Errorf("创建配置目录失败: %v", err)
		}
		// 目录创建成功，返回空用户列表
		return []*UserConfig{}, fmt.Errorf("目录创建成功，未找到任何用户配置文件")
	}

	// 读取目录中的所有.enc文件
	files, err := os.ReadDir(ConfigDir)
	if err != nil {
		return nil, fmt.Errorf("读取配置目录失败: %v", err)
	}

	var users []*UserConfig

	for _, file := range files {
		// 跳过非.enc文件
		if !strings.HasSuffix(file.Name(), ConfigFileExt) {
			continue
		}

		// 跳过隐藏文件
		if strings.HasPrefix(file.Name(), ".") {
			continue
		}

		filepath := filepath.Join(ConfigDir, file.Name())

		// 读取加密文件
		encryptedData, err := os.ReadFile(filepath)
		if err != nil {
			return nil, fmt.Errorf("读取文件 %s 失败: %v", file.Name(), err)
		}

		// 解密配置
		decryptedData, err := Decrypt(string(encryptedData), key)
		if err != nil {
			return nil, fmt.Errorf("解密文件 %s 失败: %v", file.Name(), err)
		}

		// 解析配置
		var userConfig UserConfig
		if err := json.Unmarshal(decryptedData, &userConfig); err != nil {
			return nil, fmt.Errorf("解析文件 %s 失败: %v", file.Name(), err)
		}

		users = append(users, &userConfig)
	}

	return users, nil
}

// DeleteUserConfig 删除用户配置文件
func DeleteUserConfig(username string, key []byte) error {
	files, err := os.ReadDir(ConfigDir)
	if err != nil {
		return fmt.Errorf("读取配置目录失败: %v", err)
	}

	for _, file := range files {
		if !strings.HasSuffix(file.Name(), ConfigFileExt) {
			continue
		}

		filepath := filepath.Join(ConfigDir, file.Name())

		// 读取并解密文件以检查用户名
		encryptedData, err := os.ReadFile(filepath)
		if err != nil {
			continue
		}

		decryptedData, err := Decrypt(string(encryptedData), key)
		if err != nil {
			continue
		}

		var userConfig UserConfig
		if err := json.Unmarshal(decryptedData, &userConfig); err != nil {
			continue
		}

		if userConfig.Username == username {
			return os.Remove(filepath)
		}
	}

	return fmt.Errorf("未找到用户 %s 的配置文件", username)
}
